﻿using System.IO;
using System.Windows.Forms;
using System.Xml.Serialization;
using Wykres2D;
using Wykres3D;

namespace AlgorytmyGenetyczneGUI
{
    [XmlRoot]
    public partial class FormAlgorytmyGenetyczne : Form
    {
        public const string sciezkaKonfiguracji = "Konfiguracja.xml";

        public FormAlgorytmyGenetyczne()
        {
            InitializeComponent();
            inicjalizuj();
            domyslneWartosciParametrow();
            domyslneWartosciStatystyki();
            wczytajFormAlgorytmyGenetyczne();
        }

        public void wczytajFormAlgorytmyGenetyczne()
        {
            if (!File.Exists(sciezkaKonfiguracji))
            {
                return;
            }

            FileStream fileStream = null;
            Konfiguracja konfiguracja = null;
            try
            {
                fileStream = File.Open(sciezkaKonfiguracji, FileMode.Open, FileAccess.Read);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Konfiguracja));
                konfiguracja = (Konfiguracja)xmlSerializer.Deserialize(fileStream);

                userControlParametry.WielkoscPopulacji = konfiguracja.WielkoscPopulacji;
                userControlParametry.PrawdopodobienstwoKrzyzowania =
                    konfiguracja.PrawdopodobienstwoKrzyzowania;
                userControlParametry.PrawdopodobienstwoMutacji =
                    konfiguracja.PrawdopodobienstwoMutacji;
                userControlParametry.IloscPokolen = konfiguracja.IloscPokolen;
                userControlParametry.SukcesjaElitarna = konfiguracja.SukcesjaElitarna;
                userControlParametry.WielkoscElity = konfiguracja.WielkoscElity;
                userControlParametry.DokladnoscKodowania = konfiguracja.DokladnoscKodowania;
                userControlParametry.KolekcjaFunkcji = konfiguracja.KolekcjaFunkcji;
                userControlParametry.WzorFunkcji = konfiguracja.WzorFunkcji;
                userControlParametry.StringDziedzinaStart = konfiguracja.StringDziedzinaStart;
                userControlParametry.StringDziedzinaStop = konfiguracja.StringDziedzinaStop;
                userControlStatystyka.InterwalStatystyk = konfiguracja.InterwalStatystyk;
                userControlStatystyka.InterwalHistoriiPopulacji = konfiguracja.InterwalHistoriiPopulacji;
                userControlStatystyka.SciezkaZapisuStatystyk = konfiguracja.SciezkaZapisuStatystyk;
            }
            finally
            {
                if (fileStream != null)
                    fileStream.Close();
            }

        }

        public void zapiszFormAlgorytmyGenetyczne()
        {
            TextWriter textWriter = null;
            Konfiguracja konfiguracja = new Konfiguracja();

            konfiguracja.WielkoscPopulacji = userControlParametry.WielkoscPopulacji;
            konfiguracja.PrawdopodobienstwoKrzyzowania = userControlParametry.PrawdopodobienstwoKrzyzowania;
            konfiguracja.PrawdopodobienstwoMutacji = userControlParametry.PrawdopodobienstwoMutacji;
            konfiguracja.IloscPokolen = userControlParametry.IloscPokolen;
            konfiguracja.SukcesjaElitarna = userControlParametry.SukcesjaElitarna;
            konfiguracja.WielkoscElity = userControlParametry.WielkoscElity;
            konfiguracja.DokladnoscKodowania = userControlParametry.DokladnoscKodowania;
            konfiguracja.KolekcjaFunkcji = userControlParametry.KolekcjaFunkcji;
            konfiguracja.WzorFunkcji = userControlParametry.WzorFunkcji;
            konfiguracja.StringDziedzinaStart = userControlParametry.StringDziedzinaStart;
            konfiguracja.StringDziedzinaStop = userControlParametry.StringDziedzinaStop;
            konfiguracja.InterwalStatystyk = userControlStatystyka.InterwalStatystyk;
            konfiguracja.InterwalHistoriiPopulacji = userControlStatystyka.InterwalHistoriiPopulacji;
            konfiguracja.SciezkaZapisuStatystyk = userControlStatystyka.SciezkaZapisuStatystyk;


            try
            {
                textWriter = new StreamWriter(sciezkaKonfiguracji);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Konfiguracja));
                xmlSerializer.Serialize(textWriter, konfiguracja);
                
                }
            finally
            {
                if (textWriter != null) textWriter.Close();
            }
            }

        private void inicjalizuj()
        {
            this.userControlParametry = new UserControlParametry();
            this.userControlSterowanie = new UserControlSterowanie(this);
            this.userControlStatystyka = new UserControlStatystyka();
            this.formWykres2D = new FormWykres2D();
            this.formWykres3D = new FormWykres3D();
            this.formWynik = new FormWynik();
            this.groupBoxParametry = new System.Windows.Forms.GroupBox();
            this.groupBoxParametry.SuspendLayout();
            this.groupBoxSterowanie = new System.Windows.Forms.GroupBox();
            this.groupBoxSterowanie.SuspendLayout();
            this.groupBoxStatystyki = new System.Windows.Forms.GroupBox();
            this.groupBoxStatystyki.SuspendLayout();
            this.SuspendLayout();

            // 
            // userControlParametry
            // 
            this.userControlParametry.Location = new System.Drawing.Point(3, 18);
            this.userControlParametry.Dock = DockStyle.Fill;
            this.userControlParametry.Name = "userControlParametry";
            // 
            // groupBoxParametry
            // 
            this.groupBoxParametry.Location = new System.Drawing.Point(12, 12);
            this.groupBoxParametry.Name = "groupBoxParametry";
            this.groupBoxParametry.Size = new System.Drawing.Size(190, 470);
            this.groupBoxParametry.TabIndex = 0;
            this.groupBoxParametry.TabStop = false;
            this.groupBoxParametry.Text = "Parametry";
            this.groupBoxParametry.Controls.Add(userControlParametry);
            // 
            // userControlSterowanie
            // 
            this.userControlSterowanie.Location = new System.Drawing.Point(3, 18);
            this.userControlSterowanie.Dock = DockStyle.Fill;
            this.userControlSterowanie.Name = "userControlSterowanie";
            // 
            // groupBoxSterowanie
            // 
            this.groupBoxSterowanie.Location = new System.Drawing.Point(208, 12);
            this.groupBoxSterowanie.Name = "groupBoxSterowanie";
            this.groupBoxSterowanie.Size = new System.Drawing.Size(190, 242);
            this.groupBoxSterowanie.TabIndex = 1;
            this.groupBoxSterowanie.TabStop = false;
            this.groupBoxSterowanie.Text = "Sterowanie";
            this.groupBoxSterowanie.Controls.Add(userControlSterowanie);
            // 
            // userControlStatystyki
            // 
            this.userControlStatystyka.Location = new System.Drawing.Point(3, 18);
            this.userControlStatystyka.Dock = DockStyle.Fill;
            this.userControlStatystyka.Name = "userControlStatystyka";
            // 
            // groupBoxStatystyki
            // 
            this.groupBoxStatystyki.Location = new System.Drawing.Point(208, 260);
            this.groupBoxStatystyki.Name = "groupBoxStatystyki";
            this.groupBoxStatystyki.Size = new System.Drawing.Size(190, 222);
            this.groupBoxStatystyki.TabIndex = 2;
            this.groupBoxStatystyki.TabStop = false;
            this.groupBoxStatystyki.Text = "Statystyki";
            this.groupBoxStatystyki.Controls.Add(userControlStatystyka);
            // 
            // FormAlgorytmyGenetyczne
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(403, 485);
            this.Controls.Add(this.groupBoxStatystyki);
            this.Controls.Add(this.groupBoxSterowanie);
            this.Controls.Add(this.groupBoxParametry);
            this.Name = "FormAlgorytmyGenetyczne";
            this.Text = "Prosty algorytm genetyczny";
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
            this.groupBoxParametry.ResumeLayout(false);
            this.groupBoxSterowanie.ResumeLayout(false);
            this.groupBoxStatystyki.ResumeLayout(false);
            this.ResumeLayout(false);

        }

        public UserControlParametry userControlParametry;
        private UserControlSterowanie userControlSterowanie;
        public UserControlStatystyka userControlStatystyka;
        private System.Windows.Forms.GroupBox groupBoxParametry;
        private System.Windows.Forms.GroupBox groupBoxSterowanie;
        private System.Windows.Forms.GroupBox groupBoxStatystyki;

        private void domyslneWartosciParametrow()
        {
            userControlParametry.WielkoscPopulacji = 300;
            userControlParametry.PrawdopodobienstwoKrzyzowania = 0.25;
            userControlParametry.PrawdopodobienstwoMutacji = 0.01;
            userControlParametry.IloscPokolen = 200;
            userControlParametry.SukcesjaElitarna = false;
            userControlParametry.WielkoscElity = 10;
            userControlParametry.DokladnoscKodowania = 6;
            userControlParametry.WzorFunkcji = @"y = -pow(x1,2) - pow(x2,2)";
            userControlParametry.StringDziedzinaStart = "-1;-1";
            userControlParametry.StringDziedzinaStop = "1;1";
        }

        private void domyslneWartosciStatystyki()
        {
            userControlStatystyka.InterwalStatystyk = 1;
            userControlStatystyka.InterwalHistoriiPopulacji = 10;
            userControlStatystyka.SciezkaZapisuStatystyk = @"E:\AlgorytmyGenetyczne";
        }
        private FormWykres3D formWykres3D;
        private FormWykres2D formWykres2D;
        private FormWynik formWynik;

        private void FormAlgorytmyGenetyczne_FormClosing(object sender, FormClosingEventArgs e)
        {
            zapiszFormAlgorytmyGenetyczne();
        }
    }
}
